/*
 * AgentIdManager.cpp
 *
 */

#include "../logger/logger.h"
#include "AgentIdManager.h"
#include "../common/ArchivoIni.h"
#include "../common/StringUtils.h"
#include "dns/DNSService.h"
#include "routing_tables/RoutingService.h"

namespace channel {

const std::string AgentIdManager::AGENT_RESOLVE_BASE_PATH="/tmp/agent_id_table_";

AgentIdManager::AgentIdManager(std::string hostName)
:m_hostName(hostName),
 m_FilePath(AgentIdManager::AGENT_RESOLVE_BASE_PATH+hostName),
 m_Sem(ipc::Semaphore::get(AgentIdManager::AGENT_RESOLVE_BASE_PATH+hostName,'a'))
{

}

AgentIdManager::~AgentIdManager()
{
}

void AgentIdManager::create(std::string hostName)
{
	ipc:: Semaphore  sem =
			ipc::Semaphore::create(AgentIdManager::AGENT_RESOLVE_BASE_PATH+hostName,'a');

	sem.initialize(1);
}

void AgentIdManager::destroy(std::string hostName)
{
	std::cout << "Destroying:"<<AgentIdManager::AGENT_RESOLVE_BASE_PATH+hostName<<std::endl;
	ipc::Semaphore::destroy(AgentIdManager::AGENT_RESOLVE_BASE_PATH+hostName,'a');

	ArchivoTexto::borrarArchivo(AgentIdManager::AGENT_RESOLVE_BASE_PATH+hostName);
}

void AgentIdManager::registerAgent(std::string agentName, int& mtype)
{
	int nroAgente;
	m_Sem.wait();

	MapaIni agentMTypes = ArchivoIni::parsearComoIni(m_FilePath);

	//Si no tgo el id del agente en el archivo de configuracion
	if(agentMTypes[agentName] == "")
	{
		CLogger::log("No se conocia el id del agente: "+agentName+" solicitando al servidor",
				LogLevelEnum::DEBUG);

		if(mtype == 0)
			DNSService::registerName(agentName,nroAgente);
		else
			nroAgente = mtype;

		agentMTypes[agentName] = StringUtils::NumberToString(nroAgente);

		ArchivoIni::guardarComoIni(m_FilePath,agentMTypes);
	}
	else
		nroAgente = StringUtils::StringToNumber<int>(agentMTypes[agentName]);

	channel::RoutingService::registerAgent(m_hostName,agentName);

	m_Sem.signal();
}

void AgentIdManager::unregisterAgent(std::string agentName)
{
	m_Sem.wait();
	m_Sem.signal();
}

int AgentIdManager::getAgentId(std::string agentName)
{
	int nroAgente;
	m_Sem.wait();

	MapaIni agentMTypes = ArchivoIni::parsearComoIni(m_FilePath);

	//Si no tgo el id del agente en el archivo de configuracion
	if(agentMTypes[agentName] == "")
	{
		CLogger::log("No se conocia el id del agente: "+agentName+" solicitando al servidor",
				LogLevelEnum::DEBUG);
		DNSService::registerName(agentName,nroAgente);
	}
	else
		nroAgente = StringUtils::StringToNumber<int>(agentMTypes[agentName]);

	m_Sem.signal();

	return nroAgente;
}

} /* namespace channel */
